package main

import (
	"fmt"           // 导入格式化包，用于格式化字符串
	"net/http"      // 导入网络/http包，用于处理HTTP请求和响应
	"path/filepath" // 导入路径处理包，用于文件路径操作

	"github.com/gin-gonic/gin" // 导入Gin框架包，用于构建Web服务器
)

func main() {
	r := gin.Default() // 创建一个默认的Gin引擎实例，包含Logger和Recovery中间件

	// 处理GET请求，路径为/upload，返回上传页面
	r.GET("/upload", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil) // 渲染index.html模板，状态码200
	})

	// 处理POST请求，路径为/upload，用于处理文件上传
	r.POST("/upload", func(c *gin.Context) {
		// 获取上传的单个文件，表单字段名为"file"
		file, err := c.FormFile("file")
		if err != nil { // 如果获取文件出错
			c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err.Error())) // 返回400错误和错误信息
			return
		}

		// 获取文件名的基础部分，避免路径穿越
		filename := filepath.Base(file.Filename)
		// 构造保存路径，存放在uploads目录下
		savePath := filepath.Join("uploads", filename)

		// 保存上传的文件到指定路径
		if err := c.SaveUploadedFile(file, savePath); err != nil { // 如果保存出错
			c.String(http.StatusInternalServerError, fmt.Sprintf("upload file err: %s", err.Error())) // 返回500错误和错误信息
			return
		}

		// 上传成功，返回成功信息
		c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded successfully.", filename))
	})

	// 加载HTML模板文件
	r.LoadHTMLFiles("templates/index.html")

	// 启动Web服务器，监听端口8080
	r.Run(":80")
}
